package vip.zhenzicheng.design_patterns.proxy.cglib_proxy;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * CGlib 实现动态代理
 *
 * @author zhenzicheng
 * @date 2022-05-25 19:23
 */
public class ProxyFactory implements MethodInterceptor {

  // 声明火车站对象
  private final TrainStation station = new TrainStation();

  public TrainStation getProxyObject() {
    // 创建Enhancer对象，类似于JDK代理中的Proxy类
    Enhancer enhancer = new Enhancer();
    // 设置父类的字节码对象。指定父类
    enhancer.setSuperclass(TrainStation.class);
    // 设置回调函数
    enhancer.setCallback(this);
    // 创建代理对象
    return (TrainStation) enhancer.create();
  }

  /**
   * 代理拦截方法
   *
   * @param obj         被代理的对象
   * @param method      被代理的方法
   * @param objects     代理方法的参数列表
   * @param methodProxy 方法代理,包含被代理和代理后的对象的一些信息
   * @return 被代理对象执行被代理方法后的真正返回值
   */
  public Object intercept(Object obj, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
    System.out.println("代售点收取一定的服务费用(CGLib代理)");
    // 要调用目标对象的方法
    return method.invoke(station, objects);
  }
}
